XCOPY
이 명령어는 서브디렉토리를 포함하여 파일과 디렉토리를 복사하기 위하여 사용하는 것으로, Copy 명령어를 사용하여 복사할 수 없었던 빈 디렉토리를 복사할 수 있다.
Copy 명령어는 하나의 파일씩 파일 단위로 복사하지만 XCOPY는 버퍼 단위로 파일을 복사하기 때문에 다수의 파일을 읽고 다수의 파일을 동시에 기록한다. 따라서, Copy 명령어보다 더 빠르게 파일을 복사할 수 있다.
또한, Diskcopy는 플로피디스크에서만 사용할 수 있고, 디스크를 물리적인 트랙 단위로 복사하는데 반하여 XCOPY는 파일을 물리적으로 복사하지 않기 때문에 디스크 상에 있는 파쇄를 피할 수 있고, 드라이브의 크기가 다른 경우나 하드디스크에서도 사용할 수 있다.
■ 명령어 위치
윈도우가 설치되어 있는 하드디스크(C:\Windows\Command)에 실행 파일 형태로 존재하는 외부 명령어
■ 사용법

XCOPY | [/Y|/-Y] source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/W] [/C] [/I] [/Q] [/F] [/L] [/H] [/R] [/T] [/U] [/K] [/N]

■ 옵션 및 매개변수

/y | 목적지에 같은 이름의 파일이 있을 때 사용자 확인없이 덩어쓴다.
/-y | 목적지에 같은 이름의 파일이 있을 때 덮어쓸 것인지 사용자에게 확인한다. 만약, 항상 목적지 파일을 대체하기 전에 사용자에게 확인하도록 하려면 SET 명령어를 사용하여 COPYCMD 환경 변수를 설정할 수 있다.
sousce | 복사할 원본 파일의 경로와 이름을 지정한다. sousce에는 반드시 드라이브나 경로를 포함하여야 한다. 드라이브 이름과 경로를 지정하지 않으면 현행 디렉토리(폴더)의 파일이 원본이 된다.
destination | 파일이 기록될 목적지를 지정한다. 목적지에는 드라이브 문자와 콜론, 디렉토리명, 파일명 등이 포함될 수 있고, 그 조합도 가능하다.
/a | 기록 속성을 가진 원본 파일만 복사하고, 원본 파일의 기록 속성을 해제하지 않는다. 이 옵션은 /m 옵션과 함께 사용될 수 없다.
/m | 기록 속성을 가진 원본 파일만 복사하고, /a 옵션과는 달리 복사한 원본 파일의 기록 속성을 제거한다. 변경된 데이터 파일만 선택적으로 백업하는데 유용한 옵션이다.
/d:date | 지정된 날짜 이후에 변경되어거나 수정된 원본 파일만 복사한다. 만약, date 값이 생략되고 /d 옵션만 사용되면, XCOPY는 기존의 목적지 파일의 시간보다 더 나중에 작성된 원본 파일을 모두 복사한다. 이 옵션은 사용자가 변경된 파일만 복사함으로써 파일이 갱신될 수 있도록 한다. 데이터 파일이 변경되었다는 것을 인식하는 것은 파일이 기록 속성을 가지고 있는가에 따라 결정된다.
/p | 파일이나 서브 디렉토리(폴더)를 복사할 때 사용자에게 확인을 요구하는 메시지를 보여준다.
/s | 디렉토리가 비어 있지 않는 한, 현행 디렉토리의 모든 파일과 모든 서브디렉토리를 복사한다. 이 옵션을 사용하지 않는 경우, XCOPY는 단일 디렉토리에 있는 파일만 복사한다. "/s /e"와 같이 사용되면 비어 있는 디렉토리도 복사한다.
/e | 디렉토리가 비어 있는 경우에도 모든 서브디렉토리를 복사한다. 이 옵션은 /s 옵션과 함께 사용된다.
/w | 파일 복사를 시작하기 전에 다음과 같은 메시지를 디스플레이하고 사용자가 임의의 키를 누를 때까지 대기한다. Press any key to begin copying file(s)
/c | xcopy는 파일을 복사하는 도중 오류가 발생하면 다음 파일을 복사하지 않는다. 그러나, /c 옵션을 사용하면 오류가 발생해도 다음 파일의 복사 작업을 계속한다.
/i | 대상이 존재하지 않고 하나 이상의 파일을 복사할 경우 대상을 디렉터리로 가정한다.
/q | 복사하는 동안 파일 이름을 표시하지 않는다.
/f | 복사하는 동안 원본 및 대상 이름을 자세히 표시한다.
/L | 복사할 파일을 표시한다.
/h | 숨김 파일과 시스템 파일도 복사한다.
/r | 읽기 전용 파일을 덮어쓴다. 이 옵션을 지정하지 않은 상황에서 읽기 전용 파일을 만나면 덮어쓸 것인지 확인하는 메시지가 나타난다.
/t | 실제 파일은 복사하지 않고 디렉토리 구조만 복사한다. 단, 빈 디렉토리나 서브 디렉토리는 포함하지 않는다. /T /E 옵션을 함께 사용하면 빈 디렉토리와 서브 디렉토리도 포함한다.
/u | 목적지에 이미 존재하는 파일만 업데이트한다. 업데이트의 기준이 되는 것은 원본 파일의 기록 속성이다.
/k | 특성까지 목적지로 그대로 복사한다. 이 옵션을 사용하지 않으면 Xcopy는 목적지에 파일을 복사한 후 읽기 전용 특성을 제거한다.
/n | 이 옵션을 사용하면 긴 파일 이름 대신 짧은 파일 이름을 화면에 표시한다. 그렇다고 긴 파일 이름이 제거되지는 않는다.

■ 참고 사항
☞ 환경 변수 지정하기
XCOPY 명령어를 이용할 때 목적지에 이미 같은 이름의 파일이 있는 경우 덮어쓸 것인가를 사용자에게 확인할 수 있는 옵션을 제공한다.
만약, 원본 파일로 목적지 파일을 대체하기 전에 사용자에게 덮어쓸 것인지를 확인하기 위한 메시지가 나타나도록 하려면 SET 명령어를 사용하여 XCOPY 명령어의 환경 변수를 지정할 수 있다.
컴퓨터의 시동과 동시에 항상 확인할 필요가 있는 경우에는 AUTOEXEC.BAT 파일에 다음과 같이 XCOPY 명령어의 환경 변수를 지정할 수 있다.
set copycmd=/-y
위와 같이 XCOPY 명령어의 환경 변수를 지정한 경우에는 파일을 복사 혹은 이동하기 위하여 사용하는 모든 명령어 즉, Copy, Move, XCOPY 명령어 등에 모두 적용된다. 따라서, COPYCMD 환경 변수의 지정은 단순히 XCOPY 명령어에만 국한되는 것이 아니라 파일의 복사와 이동에 모두 적용된다는 것이다.
만약, COPYCMD 환경 변수를 목적지 파일을 대체할 때 사용자에게 확인하지 않도록 변경하려면 다음과 같이 SET 명령어를 사용한다.
set copycmd=/y
☞ 목적지에 대한 디폴트 값
XCOPY 명령어를 사용할 때 목적지를 생략하면, XCOPY는 현행 디렉토리를 목적지 드라이브와 디렉토리로 사용한다.
☞ 목적지가 파일인지 디렉토리인지를 지정하기
사용자가 지정한 목적지가 기존의 디렉토리를 포함하지 않고, 목적지를 지정할 때 역슬래쉬(\)로 끝을 지정하지 않으면 XCOPY는 다음과 같은 형식으로 메시지를 디스플레이하고, 사용자에게 마지막으로 지정한 것이 파일인지 디렉토리인지를 확인하는 메시지를 모여준다.
Does destination specify a filename
or directory name on the target
(F=File, D=Directory)?
만약, 사용자가 파일로 복사하려면 <F>를 누른다. 새로운 디렉토리로 만들도록 하려면 즉, 디렉토리로 복사되도록 하려면 <D>를 누른다.
☞ 목적지 파일의 기록 속성
XCOPY는 원본 파일이 기록 속성을 가지고 있건 가지고 있지 않건 관계없이 목적지 파일에 기록 속성을 부여한다.
만약, 기록 속성만 가진 원본 파일을 디렉토리로 복사하려면 Copy 명령어를 사용하기 바란다.
☞ XCOPY와 DISKCOPY
서브디렉토리에 파일을 포함하는 디스크를 가지고 있고, 그것을 다른 유형의 디스크에 복사하려면 XCOPY 명령어를 사용해야 한다. 동일한 유형의 디스크인 경우에는 Diskcopy를 사용할 수 있다.
즉, Diskcopy는 디스크를 트랙 단위로 복사하기 때문에 반드시 원본과 목적지 디스크가 동일 유형일 것을 요구하고, 플로피디스크일 것을 요구한다.
이와 달리 XCOPY는 다른 유형의 디스크에도 사용할 수 있다. 즉, XCOPY는 트랙 단위가 아니라 파일 단위로 복사를 하기 때문이다. 따라서 디스크의 완전한 이미지 복사를 필요로 하지 않는 한 XCOPY를 사용하는 것이 좋다.
☞ 종료 코드(Exit Codes)
다음은 XCOPY 명령어의 종료 코드와 그에 대한 설명이다.

0 | 파일이 에러 없이 복사되었다.
1 | 원본 파일을 찾을 수 없다.
2 | 사용자가 XCOPY를 중단하기 위하여 <Ctrl+C>를 눌렀다.
3 | 초기화 에러가 발생하였다. 충분한 메모리 또는 디스크 영역이 부족하다.
4 | 사용자가 적절하지 않은 드라이브를 지정하였거나 명령어 라인에 적절하지 않은 형식을 사용하였다.
5 | 목적지 디스크에 쓰기 에러가 발생하였다.

사용자는 XCOPY 명령어에 의하여 시스템에 리턴된 종료 코드를 처리하기 위하여 배치 프로그램의 IF 명령어 라인에 errorlevel 매개변수를 사용할 수 있다. 배치 프로그램의 작성 방법에 관해서는 "사용 예" 부분을 참조하기 바란다.
■ 사용 예
A드라이브에 있는 디스크로부터 비어 있는 서브디렉토리를 포함한 모든 파일과 디렉토리를 B드라이브에 있는 디렉토리에 복사하려면 다음과 같이 XCOPY 명령어를 사용한다.
xcopy a: b: /s /e
위의 예에서 파일을 목적지로 기록한 후 정상적으로 기록되었는지 확인하려면 다음과 같이 XCOPY 명령어를 사용한다.
xcopy a: b: /s /e /v
C드라이브 상의 REPORTS 디렉토리에 있는 파일을 RAWDATE 디렉토리에 있는 파일 중에서 2000년 12월 31일 이후에 변경된 파일로 갱신하려면 다음과 같이 XCOPY 명령어를 사용한다.
xcopy c:\reports c:\rawdate /d:12-31-2000
지금까지 사용하던 하드디스크 드라이브를 새로운 하드디스크 드라이브로 그대로 이동시키려면 새로운 하드디스크 드라이브의 분할과 볼륨을 작성하고, 포맷한 후 다음과 같이 Xcopy 명령어를 사용한다. 단, 새로운 하드디스크 드라이브를 D라고 가정한다.
Xcopy c:\*.* d:\ /s /e /c /h /k
위의 예에서 /s /e /h /k 옵션은 반드시 지정해야 한다. 만약, /k 옵션을 지정하지 않으면 파일이 복사된 후 읽기 전용 속성이 사라지기 때문에 즐겨찾기나 서류 가방의 기능이 사라진다.
또한, D 드라이브에 시스템을 이미 전송한 경우라면 Io.sys 파일은 절대 덮어쓰지 않도록 해야 한다. 그러나, Msdos.sys 파일은 반드시 덮어써야 한다. 다른 파일은 덜어쓰던 덮어쓰지 않던 관계 없다.
XCOPY를 이용하여 파일을 다른 경로로 백업하려면 다음과 같이 Xcopy 명령어를 사용한다.
xcopy c:\work\*.* z:\work /i /s /e /r /k
위의 예에서와 같이 파일을 백업한 경우 다음에 변경된 파일만 선택적으로 백업하려면 다음과 같이 Xcopy 명령어를 사용합니다.
xcopy c:\work\*.* z:\work /i /m /s /e /r /k /y
사용자는 XCOPY를 수행하는 배치 프로그램을 만들 수 있고, 에러가 발생하는 경우에 종료 코드를 처리하기 위하여 IF 명령어를 사용할 수 있다. 다음의 예는 종료 코드를 처리하기 위한 배치 프로그램 COPYIT.BAT 파일로 XCOPY의 원본과 목적지의 매개변수에 교체 가능한 변수를 사용하고 있다.
@echo off
rem copyit.bat transfers all filed in all subdirectories
rem of the source dirve or directory (%1) to the destination
rem drive or directory (%2)
xcopy %1 %2 /s /e
if errorlevel 5 goto write_err
if errorlevel 4 goto lowmemory
if errorlevel 2 goto abort
if errorlevel 1 goto not_source
if errorlevel 0 goto xcopy_ok
:write_err
echo 목적지 드라이브에 기록 에러가 발생하였습니다.
goto exit
:lowmemory
echo 파일을 복사하는데 메모리가 부족하거나, 적절하지 않은 드라이브 이름이나
echo 잘못된 명령어 형식을 사용하였습니다.
goto exit
:abort
echo 사용자가 XCOPY를 중단하기 위하여 <Ctrl+C>를 눌렀습니다.
goto exit
:not_source
echo 원본 파일을 찾을 수 없습니다.
goto exit
:xcopy ok
echo 에러 없이 정상적으로 파일을 모두 복사하였습니다.
:exit
위의 COPYIT.BAT 배치 프로그램으로 C:\PRGMCODE 디렉토리에 있는 모든 파일과 그 서브디렉토리를 B드라이브에 복사하려면 다음과 같이 COPYIT 명령어를 사용한다.
copyit c:\prgmcode b:
위의 예는 c:\prgmcode가 %1을 대신하고, b:가 %2를 대신하여 사용되고, 옵션으로 /s /e가 사용된다.
만약, XCOPY가 실행되는 도중에 에러를 만나는 경우 배치 프로그램은 종료 코드를 읽고 해당 if errorlevel 문에서 가리키는 레이블로 이동한 다음, 사용자가 지정한 메시지를 화면에 보여주고 배치 프로그램을 종료한다.